package biz.ws.ws;

import java.time.LocalDateTime;
import java.util.LinkedList;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Supplier;

/**
 * @创建人 wsdc
 * @时间 2021/4/2
 * @描述 用户信息落地
 */
public interface MsgDataSource {

    /**
     *  消息的处理 持久化层是不持有状态信息的，这里更应该是数据提供者，等同于静态，公共方法区  不要有上下文的操作
     *  {@link #save(Message)}          保存消息
     *  {@link #update(Message)}        更新消息的状态
     *  {@link #update(List)}           批量更新消息
     *
     *  {@link #loadUnreadMsg(LocalDateTime, Long, Consumer)}   加载用户未读消息 比如说用户登录的时候返回 或者用户主动发起请求
     *  {@link #historyMsg(LocalDateTime, Long, Consumer)}      加载用户的历史消息 客户端和服务段的数据同步
     *
     *  注意
     *  <li>    这里考虑的一律是点对点的处理，对于点对面(群，社区) 等等没有做出考虑
     *  <li>    主要考虑的是分布式节点，数据越简单才能越好的扩展，上述的问题可以放到客户端解决
     *          或者 其他 ...
     *  <li>    返回一个空的实例 相当于不对消息进行持久化 {@link #empty}
     */
    void save(Message msg);

    void update(Message msg);

    void update(List<Message> msgList);

    void loadUnreadMsg(LocalDateTime after,Long toId, Consumer<List<Message>> consumer);

    void historyMsg(LocalDateTime after,Long toId,Consumer<List<Message>> consumer);

    public static final MsgDataSource empty = new MsgDataSource() {
        @Override
        public void save(Message msg) {

        }

        @Override
        public void update(Message msg) {

        }

        @Override
        public void loadUnreadMsg(LocalDateTime after,Long toId, Consumer<List<Message>> consumer) {
            consumer.accept(new LinkedList<>());
        }

        @Override
        public void historyMsg(LocalDateTime after, Long toId,Consumer<List<Message>> consumer) {
            consumer.accept(new LinkedList<>());
        }

        @Override
        public void update(List<Message> msgList) {

        }
    };
}
